function mySymbol(obj) {
  // 不要问我为什么这么写，我也不知道就感觉这样nb
  let unique = (Math.random() + new Date().getTime()).toString(32).slice(0, 8)
      // 牛逼也要严谨
  if (obj.hasOwnProperty(unique)) {
      return mySymbol(obj) //递归调用
  } else {
      return unique
  }
}

Function.prototype.myCall = function(context, ...args) {
  if (typeof this !== "function") {
    throw new TypeError("not a function")
  }
  // 如果没有传或传的值为空对象 context指向window
  context = context || window
  // 防止覆盖已有属性
  let fn = mySymbol(context)
  context[fn] = this //给context添加一个方法 指向this
  let result = context[fn](...args) //执行fn
  delete context[fn] //删除方法
  return result
}

// 测试
var obj = { name: 123 }
function foo(...args) {
  console.log(this.name, args)
}
var s = foo.myCall(obj, '111', '222')